iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

物件導向告訴我們,把資料和流程封裝起來,可以避免牽一髮而動全身,讓程式容易修改,並且可以藉由繼承和多型,在保持良好封裝的同時避免重複撰寫程式碼。然而在物件導向的基礎下,再怎麼封裝、壓縮、抽象化,終究還是會需要插入一小段程式碼來呼叫被壓縮的流程 (下圖左邊,紅色)。

當多個本來不相干的流程(上圖右邊,黃綠藍),在特定切入點中都會重複插入跟主要流程無關但又必要的流程時(上圖右邊,紅),物件導向就非常難以保持關注點分離原則,因為我們想關注的主要流程(黃綠藍)跟必要但繁瑣可以忽略的重複流程(紅)混雜在一起了。遇到這種情況純粹的 OOP 可能有些無能為力,但使用切面導向程式設計 (Aspect-Oriented Programming) 就能很有效的解決這類問題。

關注點分離(Separation of concerns,SoC),是將計算機程序分隔為不同部份的設計原則。每一部份會有各自的關注焦點。

有AOP的輔助,我們就可以把重複但可忽略的流程從主要流程中給抽離,讓主要的流程看起來沒有插入任何相關的程式碼(上圖左邊),但是實際執行時卻會執行被抽離的流程(上圖右邊)。那 ... 要怎麼達成以上如同魔法一般的目標呢? 實際上操作 AOP 之類的工具通常會有以下幾個步驟

  1. 實作一個切面(Aspect),具備以下特性(1)會被重複插入(2)跟主要流程無關
  2. 選擇切入點(PointCut)(就是想要插入的目標),常見工具會用標記語法(@Xxxx)來選擇目標
  3. 選擇切入的時機,在執行之前、執行之後、回傳或者是拋出錯誤時,把切面程式展開來執行

最後補充,在不同的語言或不同的工具中,或許會有區分不同的實作方法,例如 Run-time AOP 或是 Compile-time AOP,然而無論是哪一種 AOP 背後其實都是相同的精神「把重複但跟主要邏輯無關的流程抽出並隱藏」,類似的手段 FP 也非常擅長,預計明天介紹~


上一篇
D05 - 物件導向
下一篇
D07 - 函數式
系列文
六邊形戰士程式設計12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言